package mx.edu.itschapala.ssrp.bean;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import mx.edu.itschapala.ssrp.dao.UsuarioDAO;
import mx.edu.itschapala.ssrp.ln.ReportesLN;
import mx.edu.itschapala.ssrp.modelo.Empresa;
import mx.edu.itschapala.ssrp.modelo.IntegranteResidencia;
import mx.edu.itschapala.ssrp.modelo.Personal;
import mx.edu.itschapala.ssrp.modelo.Proyecto;
import mx.edu.itschapala.ssrp.modelo.Usuario;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.primefaces.context.RequestContext;

/**
 *
 * @author ZANTA
 */
@ManagedBean
@ApplicationScoped
public class ReportesBean {

    @EJB
    private UsuarioDAO usuarioDAO;

    private Usuario usuario;
    private Usuario u;

    @EJB
    private ReportesLN reportesLN;
    private Empresa empresa;

    private Proyecto proyecto;
    private List<Usuario> integrantes;

    public Proyecto getProyecto() {
        return proyecto;
    }

    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    public void prepProyecto(ActionEvent e) {
        
        proyecto = (Proyecto) e.getComponent().getAttributes().get("proyecto");
        integrantes = new ArrayList<>();
        for (IntegranteResidencia i : reportesLN.getIntegrantes(proyecto)) {
            System.out.println(">>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>" + reportesLN.getUsuarioPorNcontrol(i.getAlumno()).getNombre());
            integrantes.add(reportesLN.getUsuarioPorNcontrol(i.getAlumno()));
        }

    }

    public List<Usuario> getIntegrantes() {

        return integrantes;
    }

    public Usuario getAlumPorID(String id) {

        return reportesLN.getUsuarioPorNcontrol(id);
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /**
     * Creates a new instance of TestBean
     */
    public ReportesBean() {
    }

    public void pdfAsignacionAsesor() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/AsignacionAsesor" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());
                parametros.put("periodo", p.getPeriodo());
                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("academia", usuario.getAcademia());

            }
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Asignacion_Asesor.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();

        }
    }

    public void pdfAsignacionRevisor() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/AsignacionRevisor" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
//        parametros.put("logo", imagen);
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());

                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("academia", usuario.getAcademia());

            }

            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Asignacion_Revisor.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    public void pdfCartaPresentacion() throws JRException, IOException {

        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/CartaPresentacion" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
//        parametros.put("logo", imagen);
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());

                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("ncontrol", usuario.getNcontrol());
                parametros.put("academia", usuario.getAcademia());
                parametros.put("tipoSeguro", usuario.getTipoSeguro());
                parametros.put("numSeguro", usuario.getNumSeguro());
            }

            for (Personal pe : reportesLN.getPersonalPorCarrera(usuario.getAcademia())) {
                switch (pe.getPuesto()) {
                    case "VINCULACIÓN Y DIFUSIÓN":
                        parametros.put("vinculacion", pe.getNombre());
                        break;

                }
            }

            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Carta_Presentacion.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    public void pdfDictamenAnteproyecto() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/DictamenAnteproyecto" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
//        parametros.put("logo", imagen);
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());
                parametros.put("asesorE", p.getAsesorExterno());
                if (p.getPeriodo().equals("ENE-JUN")) {
                    parametros.put("opcion1", "x");
                    parametros.put("opcion2", "");
                } else if (p.getPeriodo().equals("AGO-DIC")) {
                    parametros.put("opcion2", "x");
                    parametros.put("opcion1", "");
                }
                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("academia", usuario.getAcademia());
                parametros.put("ncontrol", usuario.getNcontrol());
                parametros.put("sexo", usuario.getSexo());

            }
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Dictamen_Anteproyecto.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();
        }
    }

    public void pdfSeguimientoProyectoR() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/seguimientoProyectoR" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
//        parametros.put("logo", imagen);
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());
                parametros.put("asesorE", p.getAsesorExterno());
                parametros.put("periodo", p.getPeriodo());
                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("academia", usuario.getAcademia());
                parametros.put("ncontrol", usuario.getNcontrol());

            }
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Seguimiento_Proyecto_Residencia.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();
        }
    }
    public void prepUsuario(ActionEvent e){
        System.out.println("holis ");
        u=(Usuario)e.getComponent().getAttributes().get("alum");
        
    }

    public String pdfSolicitudRP() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/solicitudRP" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");
        JasperPrint jasperPrint;
        Map parametros = new HashMap();
        //List<JasperPrint> reportes = new ArrayList<>();
        //Usuario usuario;
        /*for (Proyecto p : reportesLN.getListaProyecto()) {
         if (p.getStatus().equals('r')) {
         for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + p.getSeleccion());*/
        parametros.put("nombre", proyecto.getNombre());
        switch (proyecto.getSeleccion()) {
            case "banco":
                parametros.put("opcion1", "X");
                parametros.put("opcion2", "");
                parametros.put("opcion3", "");
                break;
            case "propio":
                parametros.put("opcion2", "");
                parametros.put("opcion1", "X");
                parametros.put("opcion3", "");
                break;
            case "trabajador":
                parametros.put("opcion3", "");
                parametros.put("opcion1", "");
                parametros.put("opcion2", "X");
                break;
        }
        //System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + p.getEmpresa().getGiro());
        switch (proyecto.getEmpresa().getGiro()) {
            case "INDUSTRIAL":
                parametros.put("giro1", "X");
                parametros.put("giro2", "");
                parametros.put("giro3", "");
                parametros.put("giro4", "");
                parametros.put("giro5", "");
                break;
            case "SOCIAL":
                parametros.put("giro2", "");
                parametros.put("giro1", "X");
                parametros.put("giro3", "");
                parametros.put("giro4", "");
                parametros.put("giro5", "");
                break;
            case "PÚBLICO":
                parametros.put("giro3", "");
                parametros.put("giro1", "");
                parametros.put("giro2", "X");
                parametros.put("giro4", "");
                parametros.put("giro5", "");
                break;
            case "PRIVADA":
                parametros.put("giro4", "");
                parametros.put("giro1", "");
                parametros.put("giro2", "");
                parametros.put("giro3", "X");
                parametros.put("giro5", "");
                break;
            case "OTRO":
                parametros.put("giro5", "");
                parametros.put("giro1", "");
                parametros.put("giro2", "");
                parametros.put("giro3", "");
                parametros.put("giro4", "X");
                break;
        }
        parametros.put("numIntegrantes", proyecto.getNumeroIntegrantes());
        if (proyecto.getPeriodo().equals("FEB-JUL")) {
            parametros.put("periodo", "FEBRERO-JULIO");
        } else {
            parametros.put("periodo", "AGOSTO-ENERO");
        }
        parametros.put("numIntegrantes", proyecto.getNumeroIntegrantes());

        parametros.put("empresa.nombre", proyecto.getEmpresa().getNombre());
        parametros.put("empresa.rfc", proyecto.getEmpresa().getRfc());
        parametros.put("empresa.domicilio", proyecto.getEmpresa().getDomicilio());
        parametros.put("empresa.colonia", proyecto.getEmpresa().getDomicilio());
        parametros.put("empresa.codigoPostal", proyecto.getEmpresa().getCodigoPostal());
        parametros.put("empresa.fax", proyecto.getEmpresa().getFax());
        parametros.put("empresa.ciudad", proyecto.getEmpresa().getCiudad());
        parametros.put("empresa.telefono", proyecto.getEmpresa().getTelefono());
        parametros.put("empresa.mision", proyecto.getEmpresa().getMision());
        parametros.put("empresa.nobreTitular", proyecto.getEmpresa().getNombreTitular());
        parametros.put("empresa.puestoTitular", proyecto.getEmpresa().getPuestoTitular());
        parametros.put("asesorExterno", proyecto.getEmpresa().getFirmaAcuerdo());
        parametros.put("puestoAsesor", proyecto.getEmpresa().getPuestoAcuerdo());
        parametros.put("empresa.firmaAcuerdo", proyecto.getEmpresa().getNombreTitular());
        parametros.put("empresa.puestoAcuerdo", proyecto.getEmpresa().getPuestoTitular());

        //usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
        usuario=u;
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getNcontrol());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getDomicilio());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getCiudad());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getAcademia());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getNombre());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getCorreo());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getTelefono());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getNumSeguro());
         System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<" + usuario.getTipoSeguro());
        parametros.put("ncontrol", u.getNcontrol());
        parametros.put("domicilio", u.getDomicilio());
        parametros.put("ciudad", u.getCiudad());
        parametros.put("academia", u.getAcademia());
        parametros.put("nombreAlum", u.getNombre());
        parametros.put("correo", u.getCorreo());
        parametros.put("telefono", u.getTelefono());
        parametros.put("numSeguro", u.getNumSeguro());
        if (u.getTipoSeguro().equals("IMSS")) {
            parametros.put("seguro1", "X");
            parametros.put("seguro2", "");
            parametros.put("seguro3", "");
        } else if (u.getTipoSeguro().equals("ISSSTE")) {
            parametros.put("seguro2", "X");
            parametros.put("seguro1", "");
            parametros.put("seguro3", "");
        } else if (u.getTipoSeguro().equals("OTROS")) {
            parametros.put("seguro3", "X");
            parametros.put("seguro1", "");
            parametros.put("seguro2", "");
        }

        for (Personal pe : reportesLN.getPersonalPorCarrera(u.getAcademia())) {
            switch (pe.getPuesto()) {
                case "Vinculacion":
                    parametros.put("vinculacion", pe.getNombre());
                    break;
                case "division":
                    if (pe.getCarrera().equals(u.getAcademia())) {
                        parametros.put("division", pe.getNombre());
                    }
                    break;
                case "Coordinador":
                    if (pe.getCarrera().equals(u.getAcademia())) {
                        parametros.put("coordinador", pe.getNombre());
                        parametros.put("coordinadorCarrera", pe.getCarrera());
                    }
                /*}
                 }*/

            }
        }
        parametros.put("its", "DE CHAPALA");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListaProyecto());
        parametros.put("logo", imagen);

        jasperPrint = JasperFillManager.fillReport(reportPath, parametros, new JREmptyDataSource());
                //reportes.add(jasperPrint);
        //parametros.clear();
        // }

        //JasperPrint jas=JasperFillManager.fillReport(reportPath, parametros, new JREmptyDataSource());

        /*for(JasperPrint j : reportes){
         for(JRPrintPage pag : j.getPages()){
         jas.addPage(pag);
         }
         }*/
        HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        httpServletResponse.addHeader("Content-disposition", "attachment; filename=Solicitud_Residencia_Profesional.pdf");
        ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
        /*for (JasperPrint j : reportes) {
         JasperExportManager.exportReportToPdfStream(j, servletOutputStream);

         }*/
        JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
        FacesContext.getCurrentInstance().responseComplete();
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>acabe todo");
        return "indexVinculacion.xhtml";
    }

    public void pdfFormatoEvaluacion() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/FormatoEvaluacion" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());
                parametros.put("periodo", p.getPeriodo());
                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("academia", usuario.getAcademia());
                parametros.put("ncontrol", usuario.getNcontrol());

            }
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Formato_Evaluacion.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();

        }
    }

    public void pdfFormatoAsesoria() throws JRException, IOException {
        String reportPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/FormatoAsesoria" + ".jasper");
        System.out.println("-------------------------------------" + reportPath + "-----------------------------------------");
        String imagen = FacesContext.getCurrentInstance().getExternalContext().getRealPath("reportes/sep21.jpg");

        Map parametros = new HashMap();
        parametros.put("its", "TEC");
        JRDataSource datos = new JRBeanCollectionDataSource(reportesLN.getListEmpresa());
        for (Proyecto p : reportesLN.getListaProyecto()) {
            for (IntegranteResidencia i : reportesLN.getIntegrantes(p)) {
                parametros.put("nombreP", p.getNombre());
                parametros.put("periodo", p.getPeriodo());
                Usuario usuario = reportesLN.getUsuarioPorNcontrol(i.getAlumno());
                parametros.put("nombre", usuario.getNombre());
                parametros.put("academia", usuario.getAcademia());
                parametros.put("ncontrol", usuario.getNcontrol());

            }
            JasperPrint jasperPrint = JasperFillManager.fillReport(reportPath, parametros, datos);
            HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
            httpServletResponse.addHeader("Content-disposition", "attachment; filename=Formato_Asesoria.pdf");
            ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
            JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
            FacesContext.getCurrentInstance().responseComplete();

        }
    }
}
